﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using ThanNhanTao.Server;
using DevExpress.Xpf.Core;
using System.ComponentModel;
using DevExpress.Xpf.Grid;
using ThanNhanTao.Server.BLL;
using DevExpress.XtraEditors.DXErrorProvider;
using ThanNhanTao.Report;
using ThanNhanTao.Server.Entities;
using System.Data;
using ThanNhanTao.ListTemp;
using ThanNhanTao.Server.Enum;
using System.Windows.Markup;

namespace ThanNhanTao
{
    /// <summary>
    /// Interaction logic for frmThanhToanNgoaiTru.xaml
    /// </summary>
    public partial class frmDmLoaiYeuCau : DXWindow
    {
        #region

        private const string THONG_TIN_KHONG_DUOC_DE_TRONG = "Thông tin không được để trống";
        private const string MA_LOAI_YEU_CAU_KHONG_DUOC_TRUNG = "Mã loại yêu cầu không được trùng";
        private const string SO_DONG_IN_PHAI_LON_HON_0 = "Số dòng in phải lớn hơn 0";

        #endregion

        #region Fields

        Dm_LoaiYeuCauBLL dmLoaiYeuCauBll = new Dm_LoaiYeuCauBLL();
        List<Dm_LoaiYeuCau> listLoaiYeuCau;
        bool flagThemMoi;
        string validationError;

        #endregion

        public frmDmLoaiYeuCau()
        {
            InitializeComponent();
            listLoaiYeuCau = new List<Dm_LoaiYeuCau>();
            try
            {
                flagThemMoi = true;
                BindGrid();
                SetEnableButton(false, false, false, listLoaiYeuCau.Count > 0);
            }
            catch (Exception)
            {
                DXMessageBox.Show("thiết lập thông tin không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        public void BindGrid()
        {
            listLoaiYeuCau.Clear();
            listLoaiYeuCau = dmLoaiYeuCauBll.RetrieveAllDmLoaiYeuCau();
            gridLoaiYeuCau.ItemsSource = listLoaiYeuCau;
        }

        #region Events

        private void btnThemMoi_Click(object sender, RoutedEventArgs e)
        {
            ThemMoi();
        }

        private void btnLuu_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                btnLuu.Focus();
                validationError = string.Empty;
                txtMaLoaiYeuCau.CausesValidation = true;
                txtMaLoaiYeuCau.DoValidate();
                if (txtMaLoaiYeuCau.HasValidationError)
                {
                    DXMessageBox.Show(validationError, "Thông báo", MessageBoxButton.OK, MessageBoxImage.Warning);
                    return;
                }
                txtTenLoaiYeuCau.CausesValidation = true;
                txtTenLoaiYeuCau.DoValidate();
                if (txtTenLoaiYeuCau.HasValidationError)
                {
                    DXMessageBox.Show(validationError, "Thông báo", MessageBoxButton.OK, MessageBoxImage.Warning);
                    return;
                }
                txtSoDongIn.CausesValidation = true;
                txtSoDongIn.DoValidate();
                if (txtSoDongIn.HasValidationError)
                {
                    DXMessageBox.Show(validationError, "Thông báo", MessageBoxButton.OK, MessageBoxImage.Warning);
                    return;
                }
                txtSoThuTu.CausesValidation = true;
                txtSoThuTu.DoValidate();
                if (txtSoThuTu.HasValidationError)
                {
                    DXMessageBox.Show(validationError, "Thông báo", MessageBoxButton.OK, MessageBoxImage.Warning);
                    return;
                }
                dmLoaiYeuCauBll.SaveLoaiYeuCau(txtMaLoaiYeuCau.Text,txtTenLoaiYeuCau.Text,txtGhiChu.Text,Convert.ToInt32(txtSoDongIn.Text)
                                                    , Convert.ToInt16(txtSoThuTu.Text), (byte)cboDungCho.SelectedIndex, ckbKichHoat.IsChecked == true ? true : false
                                                    , flagThemMoi);
                DXMessageBox.Show("Lưu thông tin thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Information);
                BindGrid();
                ThemMoi();
            }
            catch (Exception)
            {
                DXMessageBox.Show("Lưu thông tin không thành công","Thông báo",MessageBoxButton.OK,MessageBoxImage.Error);
            }
            
        }

        private void btnDong_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void btnXoa_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                Dm_LoaiYeuCau loaiYCXoa = gridLoaiYeuCau.GetFocusedRow() as Dm_LoaiYeuCau;
                if (loaiYCXoa != null && tbvLoaiYeuCau.FocusedRowHandle != GridControl.NewItemRowHandle)
                {
                    if (dmLoaiYeuCauBll.WasUsedLoaiYeuCau(loaiYCXoa.MaLoaiYeuCau))
                    {
                        DXMessageBox.Show("Không thể xóa thông tin đã được sử dụng", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Warning);
                        return;
                    }
                    if (DXMessageBox.Show("Bạn có chắc chắn xóa thông tin này không?", "Thông báo", MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.Yes) == MessageBoxResult.Yes)
                    {
                        dmLoaiYeuCauBll.XoaLoaiYeuCau(loaiYCXoa.MaLoaiYeuCau);
                        listLoaiYeuCau.Remove(loaiYCXoa);
                        gridLoaiYeuCau.ItemsSource = listLoaiYeuCau;
                        gridLoaiYeuCau.RefreshData();
                    }
                }
            }
            catch (Exception)
            {
                DXMessageBox.Show("Xóa thông tin không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void btnHuyBo_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                ThemMoi();
                //BindGrid();
            }
            catch (Exception)
            {
                DXMessageBox.Show("Hủy bỏ thông tin không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            
        }

        private void tbvLoaiYeuCau_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            Dm_LoaiYeuCau loaiYC = gridLoaiYeuCau.GetFocusedRow() as Dm_LoaiYeuCau;
            if (loaiYC != null && tbvLoaiYeuCau.GetRowHandleByMouseEventArgs(e) != GridControl.InvalidRowHandle)
            {
                txtMaLoaiYeuCau.IsEnabled = false;
                txtMaLoaiYeuCau.Text = loaiYC.MaLoaiYeuCau;
                txtTenLoaiYeuCau.Text = loaiYC.TenLoaiYeuCau;
                txtGhiChu.Text = loaiYC.GhiChu;
                txtSoDongIn.Text = loaiYC.SoDongInPhieu.ToString();
                txtSoThuTu.Text = loaiYC.STT.ToString();
                cboDungCho.SelectedIndex = loaiYC.DungChoNoiNgoaiTru;
                ckbKichHoat.IsChecked = loaiYC.KichHoat;
                SetEnableButton(true, false, true, listLoaiYeuCau.Count > 0);
                flagThemMoi = false;
            }
        }

        #endregion

        #region Method

        public void SetEnableButton(bool buttonthemMoi,bool buttonLuu, bool buttonHuyBo, bool buttonXoa)
        {
            btnThemMoi.IsEnabled = buttonthemMoi;
            btnLuu.IsEnabled = buttonLuu;
            btnHuyBo.IsEnabled = buttonHuyBo;
            btnXoa.IsEnabled = buttonXoa;
        }

        public void ThemMoi()
        {
            flagThemMoi = true;
            txtMaLoaiYeuCau.CausesValidation = false;
            txtTenLoaiYeuCau.CausesValidation = false;
            txtSoDongIn.CausesValidation = false;
            txtSoThuTu.CausesValidation = false;
            txtMaLoaiYeuCau.IsEnabled = true;
            txtMaLoaiYeuCau.Text = string.Empty;
            txtTenLoaiYeuCau.Text = string.Empty;
            txtGhiChu.Text = string.Empty;
            txtSoDongIn.Text = string.Empty;
            txtSoThuTu.Text = string.Empty;
            cboDungCho.SelectedIndex = 0;
            ckbKichHoat.IsChecked = true;
            SetEnableButton(false, false, true, listLoaiYeuCau.Count > 0);
            tbvLoaiYeuCau.FocusedRow = null;
        }

        #endregion

        private void txtMaLoaiYeuCau_KeyDown(object sender, KeyEventArgs e)
        {
            SetEnableButton(btnThemMoi.IsEnabled, true, true, listLoaiYeuCau.Count > 0);
        }

        private void txtTenLoaiYeuCau_KeyDown(object sender, KeyEventArgs e)
        {
            SetEnableButton(btnThemMoi.IsEnabled, true, true, listLoaiYeuCau.Count > 0);
        }

        private void txtGhiChu_KeyDown(object sender, KeyEventArgs e)
        {
            SetEnableButton(btnThemMoi.IsEnabled, true, true, listLoaiYeuCau.Count > 0);
        }

        private void txtSoDongIn_KeyDown(object sender, KeyEventArgs e)
        {
            SetEnableButton(btnThemMoi.IsEnabled, true, true, listLoaiYeuCau.Count > 0);
        }

        private void txtSoThuTu_KeyDown(object sender, KeyEventArgs e)
        {
            SetEnableButton(btnThemMoi.IsEnabled, true, true, listLoaiYeuCau.Count > 0);
        }

        private void ckbKichHoat_Unchecked(object sender, RoutedEventArgs e)
        {
            SetEnableButton(btnThemMoi.IsEnabled, true, true, listLoaiYeuCau.Count > 0);
        }

        private void txtMaLoaiYeuCau_Validate(object sender, DevExpress.Xpf.Editors.ValidationEventArgs e)
        {
            if (string.IsNullOrWhiteSpace(e.Value as string))
            {
                validationError = THONG_TIN_KHONG_DUOC_DE_TRONG;
                e.SetError(THONG_TIN_KHONG_DUOC_DE_TRONG, ErrorType.Critical);
                e.IsValid = false;
                return;
            }
            if (flagThemMoi)
            {
                if (dmLoaiYeuCauBll.IsDuplicateLoaiYeuCau(e.Value as string))
                {
                    validationError = MA_LOAI_YEU_CAU_KHONG_DUOC_TRUNG;
                    e.SetError(MA_LOAI_YEU_CAU_KHONG_DUOC_TRUNG, ErrorType.Critical);
                    e.IsValid = false;
                    return;
                }
            }
        }

        private void txtTenLoaiYeuCau_Validate(object sender, DevExpress.Xpf.Editors.ValidationEventArgs e)
        {
            if (string.IsNullOrWhiteSpace(e.Value as string))
            {
                validationError = THONG_TIN_KHONG_DUOC_DE_TRONG;
                e.SetError(THONG_TIN_KHONG_DUOC_DE_TRONG, ErrorType.Critical);
                e.IsValid = false;
                return;
            }
            else
                e.IsValid = true;
        }

        private void txtSoDongIn_Validate(object sender, DevExpress.Xpf.Editors.ValidationEventArgs e)
        {
            if (e.Value == null || e.Value.ToString() == "")
            {
                validationError = THONG_TIN_KHONG_DUOC_DE_TRONG;
                e.SetError(THONG_TIN_KHONG_DUOC_DE_TRONG, ErrorType.Critical);
                e.IsValid = false;
                return;
            }
            else
            {
                if (Convert.ToInt16(e.Value) == 0)
                {
                    validationError = SO_DONG_IN_PHAI_LON_HON_0;
                    e.SetError(SO_DONG_IN_PHAI_LON_HON_0, ErrorType.Critical);
                    e.IsValid = false;
                    return;
                }
                e.IsValid = true;
            }
                
        }

        private void txtSoThuTu_Validate(object sender, DevExpress.Xpf.Editors.ValidationEventArgs e)
        {
            if (e.Value == null || e.Value.ToString() == "")
            {
                validationError = THONG_TIN_KHONG_DUOC_DE_TRONG;
                e.SetError(THONG_TIN_KHONG_DUOC_DE_TRONG, ErrorType.Critical);
                e.IsValid = false;
                return;
            }
            else
                e.IsValid = true;
        }

        private void txtMaLoaiYeuCau_KeyUp(object sender, KeyEventArgs e)
        {
            SetEnableButton(btnThemMoi.IsEnabled, true, true, listLoaiYeuCau.Count > 0);
        }

        private void txtTenLoaiYeuCau_KeyUp(object sender, KeyEventArgs e)
        {
            SetEnableButton(btnThemMoi.IsEnabled, true, true, listLoaiYeuCau.Count > 0);
        }

        private void txtGhiChu_KeyUp(object sender, KeyEventArgs e)
        {
            SetEnableButton(btnThemMoi.IsEnabled, true, true, listLoaiYeuCau.Count > 0);
        }

        private void txtSoDongIn_KeyUp(object sender, KeyEventArgs e)
        {
            SetEnableButton(btnThemMoi.IsEnabled, true, true, listLoaiYeuCau.Count > 0);
        }

        private void txtSoThuTu_KeyUp(object sender, KeyEventArgs e)
        {
            SetEnableButton(btnThemMoi.IsEnabled, true, true, listLoaiYeuCau.Count > 0);
        }

        private void ckbKichHoat_Checked(object sender, RoutedEventArgs e)
        {
            SetEnableButton(btnThemMoi.IsEnabled, true, true, listLoaiYeuCau.Count > 0);
        }

        private void cboDungCho_SelectedIndexChanged(object sender, RoutedEventArgs e)
        {
            SetEnableButton(btnThemMoi.IsEnabled, true, true, listLoaiYeuCau.Count > 0);
        }
    }

    /// <summary>
    /// Class Converter "Dùng cho ngoại nội trú" From byte To String
    /// </summary>
    public class ByteToStringConverter : MarkupExtension, IValueConverter
    {
        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value == null) return string.Empty;

            byte trangThai = (byte)(value);
            if (trangThai == EnumDungCho.NgoaiVaNoiTru)
                return "Ngoại & Nội trú";
            else if (trangThai == EnumDungCho.NgoaiTru)
                return "Ngoại trú";
            else if (trangThai == EnumDungCho.NoiTru)
                return "Nội trú";
            else if (trangThai == EnumDungCho.KhongInRaPhieu)
                return "Không in ra phiếu";
            else
                return string.Empty;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }

        #endregion

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return this;
        }
    }
}
